/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BL;

import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import BE.BEProductoOblig;
import BE.BELineaDespacho;
import BE.BENodoDespacho;
import BE.BEPallet;
import BE.BERack;
import BE.BEProducto;
import BL.BLParametrosDespacho;
/**
 *
 * @author Elessar
 */
public class BLDespacho {
    ArrayList<BEProductoOblig> obligatorios;
    List<BELineaDespacho> lstLineaDespacho;
    List<BEPallet> lstPallets;
    ArrayList<BENodoDespacho> grafo;
    long maxDiasVenc;
    BLParametrosDespacho blParamDespacho;
    
    public BLDespacho(List<BELineaDespacho> lstLinea){
        this.lstLineaDespacho=lstLinea;
        this.maxDiasVenc=1;
        
        //getProductosObligatorios();
        //generarGrafo();
    }
    
    public void generarGrafo (){
        this.grafo = new ArrayList<BENodoDespacho>();
        grafo.add(new BENodoDespacho(0,0,0,0,0,1,1,1,0)); //nodo inicial
        
        BLPallet blPallet = new BLPallet();
        lstPallets = new ArrayList<BEPallet>();
        ArrayList<Long> lstDiasVenc = new ArrayList<Long>();
        lstDiasVenc.add(Long.parseLong("0"));
        //List<BEPallet> lstPallets = blPallet.buscarPallet(null, null, null, null, "", "");
        for (int i=0; i<this.obligatorios.size(); i++){
            ArrayList<BEPallet> auxPallets = blPallet.getPalletsDespacho(obligatorios.get(i).getIdproducto(),obligatorios.get(i).getIdtipopaleta());
            lstPallets.addAll(auxPallets);
        }
        
        BLRack blRack = new BLRack();
        blRack.cargar();        
        //recorrer todos los pallets y generar los nodos
        for (int i=0; i<lstPallets.size(); i++){
            BERack beRack = blRack.getRackfromLst(lstPallets.get(i).getPosicionxrack().getIdrack());
            int x = beRack.getPosicion().getFila();
            int y = beRack.getPosicion().getColumna()+lstPallets.get(i).getPosicionxrack().getColumna()-1;
            int z = lstPallets.get(i).getPosicionxrack().getFila(); 
            double peso = 0;
            
            BENodoDespacho nodoAux = new BENodoDespacho(i+1,lstPallets.get(i).getProducto().getIdProducto(),
                    lstPallets.get(i).getIdPallet(),lstPallets.get(i).getPaleta().getIdTipoPallet(),
                    lstPallets.get(i).getCantidad(),x,y,z,peso);
            long diasVenc = getDiasVencimiento(lstPallets.get(i).getFechaVencimiento());
            if (diasVenc>=0) {
                grafo.add(nodoAux);
                lstDiasVenc.add(diasVenc);
                System.out.println("---"+lstPallets.get(i).getFechaVencimiento()+" dias:"+diasVenc);
                if (diasVenc>this.maxDiasVenc) this.maxDiasVenc=diasVenc;
            }
            else lstPallets.remove(i);
        }       
        
        BLProducto blProducto = new BLProducto();
        //List<BEProducto> lstProductos = blProducto.listaProductos();
        for (int i=1; i<grafo.size(); i++){
            double factor = blProducto.getFactor(grafo.get(i).getIdproducto());
            double peso = (1.0-(maxDiasVenc*1.0-lstDiasVenc.get(i)*1.0)/(maxDiasVenc*1.0))*(3.0-factor)/2.0;
            grafo.get(i).setPeso(peso);
        }
    }
    
    public long getDiasVencimiento(Date fechaVenc){
        final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000;
        java.util.Date hoy = new Date(); //Fecha de hoy 
        long dias = ( fechaVenc.getTime() - hoy.getTime() )/MILLSECS_PER_DAY;
        return dias;
    }
    
    public void getProductosObligatorios(){
        ArrayList<BEProductoOblig> obligatoriosAux = new ArrayList<BEProductoOblig>();
        for (int i=0; i<this.lstLineaDespacho.size(); i++){
            int idproducto = lstLineaDespacho.get(i).getObjPXT().getIdProducto();
            int idtipopaleta = lstLineaDespacho.get(i).getObjPXT().getIdTipoPallet();
            int cantidad = lstLineaDespacho.get(i).getCantidadPallets();
            obligatoriosAux.add(new BEProductoOblig(idproducto,idtipopaleta,cantidad));
            //this.cantTotal+=cantidad;
        }
        this.obligatorios = obligatoriosAux;
    }

    public ArrayList<BEProductoOblig> getObligatorios() {
        return obligatorios;
    }

    public ArrayList<BENodoDespacho> getGrafo() {
        return grafo;
    }
    
    public void imprimir (ArrayList<BENodoDespacho> grafo){
        String auxStr="";
        for (int i=1; i<grafo.size(); i++){
            auxStr+=grafo.get(i).getIdNodo()+") prod:"+grafo.get(i).getIdproducto()+" tipop:"+grafo.get(i).getIdtipopaleta()
                    +" | x:"+grafo.get(i).getX()+" y:"+grafo.get(i).getY()+" z:"+grafo.get(i).getZ();
            if (grafo.get(i).getDist()>0)
                auxStr+=" dist:"+grafo.get(i).getDist();
            auxStr+="\n";
        }
        System.out.println(auxStr);
    }
    
    public List<BEPallet> getPalletsDespacho (ArrayList<BENodoDespacho> nodosDespacho){
        List<BEPallet> lstPalletsAux = new ArrayList<BEPallet>();
        for (int i=0; i<this.lstPallets.size(); i++){
            for (int j=0; j<nodosDespacho.size(); j++){
                if (this.lstPallets.get(i).getIdPallet()==nodosDespacho.get(j).getIdpallet())
                    lstPalletsAux.add(lstPallets.get(i));
            }
        }
        return lstPalletsAux;
    }
}
